/*

什么是32位色彩和16位色彩？


32位色彩和16位色彩是计算机图形学中常见的两种色彩深度标准，它们在颜色表现、

文件大小以及处理速度等方面存在显著差异。以下是关于它们的详细介绍：


一、32位色彩

1.定义

32位色彩中的32位指的是每个像素用32位二进制数来表示颜色信息。这32位中，

通常包括24位用于表示红（R)、绿（G)、蓝（B)三原色的组合，每种颜色占用8位，

可表示的颜色种类达到2的24次方，即约1677万种颜色，另外8位用于表示透明度（Alpha通道），

因此也被称为ARGB。

2.特点

颜色丰富：能够呈现出极其细腻的颜色渐变和丰富的色彩层次，几乎可以模拟出人眼所能感知的所有颜色，

使图像看起来更逼真、自然。

支持透明度：Alpha通道的存在使得图像可以实现透明的效果，比如在图像合成、图层叠加等操作中，

能够更加自然地融合不同的元素。

文件较大：由于每个像素需要32位来存储颜色信息，相比低色彩深度的图像，其文件大小通常会更大，

这在一定程度上会增加存储和传输的成本。

处理要求高：对计算机硬件的处理能力要求极高，在进行图像编辑、渲染等操作时，

需要更多的计算资源和时间来处理32位色彩的图像数据。


二、16位色彩

1.定义

16位色彩意味着每个像素使用16位二进制数来表示颜色。其中，通常有5位用于红色，6位用于绿色，

5位用于蓝色，通过这种组合可以产生大约65536种颜色。

2.特点

颜色有限：相较于32位色彩，16位色彩能够表示的颜色数量相对较少，在一些颜色过渡较为复杂的场景中，

可能会出现颜色带状或阶梯状的不连续现象，无法像32位色彩那样细腻地呈现颜色的渐变。

文件较小：因为每个像素只需要16位来存储颜色信息，所以生成的文件大小相对较小，更节省存储空间，

也便于在网络上快速传输。

处理速度快：在图像处理过程中，由于数据量相对较小，计算机处理16位色彩的图像速度会更快，

对硬件配置的要求也相对较低。


总之，32位色彩和16位色彩各有优缺点，在不同的应用场景中发挥着各自的作用。

32位色彩适合对图像质量和真实感要求极高的专业领域，而16位色彩则在对资源有一定限制，

且对颜色精度要求不是极高的情况下具有一定的优势。

*/

#pragma once
#include <cstdint>
namespace qing {
    /* rgb 颜色类 */
	class Color{
		public:
			unsigned char r=0,g=0,b=0;
			Color(unsigned char r=0, unsigned char g=0, unsigned char b=0, int bits = 32) {
                if (bits == 32) {
				    this->r=r;
				    this->g=g;
				    this->b=b;
                }
                else if (bits == 16) {
                    // 1. 缩放并截取高位，确保值在目标范围内
                    // 将 0-255 映射到 0-31： (r * 31) / 255
                    // 使用 + 128 是为了更好的四舍五入（可选，但能提高精度）
                    this->r  = static_cast<unsigned char>((static_cast<uint16_t>(r) * 31 + 128) / 255);
                    this->g = static_cast<unsigned char>((static_cast<uint16_t>(g) * 63 + 128) / 255);
                    this->b = static_cast<unsigned char>((static_cast<uint16_t>(b) * 31 + 128) / 255);
                }
			}
	};

    /* 预设颜色 */
	extern const Color black;
	extern const Color white;
	extern const Color green;
	extern const Color blue;
	extern const Color red;
	extern const Color gray;

    /*
     * 16位真彩色颜色类 （尚未完成）
     *
     * 优化建议：我想让机器可以根据驱动信息选择使用哪一种颜色（16位 或者 32位）
     *
     * qing(20250921): 不要复杂化，直接使用一个Color的方法将32位颜色值转换为16位
     */
	//class Color16 {
	//	public:	
	//};
}
